/*
 * @author zzr
 * @date: 2025/05/06  20:00
 * @description: 懒汉模式示例
 * 这个版本中，由于懒汉模式是既有读操作 return instance
 * 又有写操作 instance = new SingletonLazy()
 *  当在多线程执行中，会出现线程安全问题
 *  为了解决线程安全问题，我们可以 synchronized 关键字进行上锁
 *  当使用了 synchronized 关键字进行上锁后，又可能会导致效率问题
 *  可以再嵌套一层 if 来进行 解决 效率问题
 *  还有最后一点是，可能会出现指令重排序导致 bug
 *  即 instance = new SingletonLazy() 这行代码会执行三步：
 * 1. 申请一段内存空间
 * 2. 在这个内存上调用构造方法，创建出实例
 * 3. 把这个内存地址赋给 instance 引用变量
 * 可以用 volatile 关键字来解决~~
 */

class SingletonLazy {

    // 同样是 static 修饰的 instance 不过在饿汉模式的时候，会先赋值为 null
    private static SingletonLazy instance = null;

    public static SingletonLazy getInstance() {
        // 真正创建 SingletonLazy 的时机是在 getInstance 方法中
        // 即在第一次真正使用的时候，才会进行创建
        if (null == instance) {
            instance = new SingletonLazy();
        }
        return instance;
    }
    private SingletonLazy() {}
}
public class Demo2_1 {

}
